package main

import "fmt"

// usb接口的定义
// type Usb interface{
// 	//声明两个未实现的方法
// 	Start()
// 	Stop()
// }

// type Phone struct{

// }
// //让Phone实现Usb接口：也就是让Phone实现Usb接口的所有方法
// func (p Phone)Start(){
// 	fmt.Println("手机开始工作...")
// }
// func (p Phone)Stop(){
// 	fmt.Println("手机停止工作...")
// }

// type Camera struct{

// }
// //让Camera实现Usb接口：也就是让Camera实现Usb接口的所有方法
// func (c Camera)Start(){
// 	fmt.Println("相机开始工作...")
// }
// func (c Camera)Stop(){
// 	fmt.Println("相机停止工作...")
// }

// func Working(usb Usb){
// 	usb.Start()
// 	usb.Stop()
// }
// func main(){    //主函数
// 	//创建结构体变量
// 	p := Phone{}
// 	c := Camera{}
// 	Working(p)
// 	fmt.Println("----------------------------")
// 	Working(c)
// }


// //自定义数据类型实现接口
// type A interface{
// 	Say()
// }
// type Person struct{}
// func (p Person)Say(){
// 	fmt.Println("p say...")
// }

// type Student struct{
// }

// //自定义数据类型
// type myInt int    
// func (m myInt)Say(){
// 	fmt.Println("m say...")
// }

// func main(){
// 	p := Person{}
// 	var a A = p
// 	a.Say()
// 	var m myInt
// 	var a2 A = m
// 	a2.Say()
// }


// type A interface{
// 	test01()
// 	B
// 	C
// }
// type B interface{
// 	test02()
// }
// type C interface{
// 	test03()
// }
// type Person struct{}
// //让Person实现A接口:因为A接口继承了B,C接口，所以要实现A接口必须将B，C接口全部实现
// func(p Person)test01(){
// 	fmt.Println("test01...")
// }
// //实现接口B
// func(p Person)test02(){
// 	fmt.Println("test02...")
// }

// //实现接口C
// func(p Person)test03(){
// 	fmt.Println("test03...")
// }

// //定义一个函数，可以接收任何类型的参数
// func PrintAnything(i interface{}){
// 	fmt.Println(i)
// }

// func main(){
// 	PrintAnything(22)
// 	// PrintAnything(22.34)
// 	PrintAnything("你好")
// 	p := Person{}
// 	var a A = p  //要想将Person类型的p赋值给A接口类型的a，必须让Person实现A接口
// 	//Person没有实现A接口   ----> 因为Person没有实现C接口，而A接口继承了C接口，所以Person没有实现A接口
// 	a.test01()
// 	var a2 A
// 	fmt.Println(a2)
// 	//空接口：空接口里没有任何方法，所以可以认为所有类型都实现了空接口，那就可以将所有类型的值都赋值给空接口变量
// 	// var t interface{}
// 	// t = p 
// 	// t = 
// }




// type A interface{
// 	test01()
// }
// type Person struct{}
// func(p *Person)test01(){        //!!!!!!!!注意：这里test01方法绑定的是*Person，所以是*Person实现了A接口，而不是Person
// 	fmt.Println("test01...")
// }
// func main(){
// 	p :=&Person{}
// 	var a A =p
// 	a.test01()
// }



// type Animal interface {
// 	Sound()
// }

// type Dog struct{}
// func (d Dog) Sound() {
// 	fmt.Println("汪汪汪~~~~~~~~~~~~~~~~~~~")
// }

// type Cat struct{}
// func (c Cat) Sound() {
// 	fmt.Println("喵喵喵~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
// }

// func Working(a Animal) {
// 	a.Sound()
// }

// func main() {
// 	p := Dog{}
// 	c := Cat{}
// 	Working(p)
// 	fmt.Println("----------------------------")
// 	Working(c)
// }



// type Usb interface{
// 	//声明两个未实现的方法
// 	Start()
// 	Stop()
// }

// type Phone struct{
// 	name string

// }
// //让Phone实现Usb接口：也就是让Phone实现Usb接口的所有方法
// func (p Phone)Start(){
// 	fmt.Println("手机开始工作...")
// }
// func (p Phone)Stop(){
// 	fmt.Println("手机停止工作...")
// }

// type Camera struct{
// 	name string
// }
// //让Camera实现Usb接口：也就是让Camera实现Usb接口的所有方法
// func (c Camera)Start(){
// 	fmt.Println("相机开始工作...")
// }
// func (c Camera)Stop(){
// 	fmt.Println("相机停止工作...")
// }

// func Working(usb Usb){
// 	usb.Start()
// 	usb.Stop()
// }

// type Student struct{}


// func main(){    //主函数
// 	var arr [3]int = [3]int{3,5,7}
// 	fmt.Println(arr)
// 	var usbArr [3]Usb
// 	usbArr[0] = Phone{"小米"}
// 	usbArr[1] = Phone{"华为"}
// 	usbArr[2] = Camera{"佳能"}
// 	fmt.Println(usbArr)
// }



// type Point struct{
// 	x int
// 	y int
// }

// func main(){
// 	var a interface{}
// 	p := Point{2,4}
// 	a = p

// 	if b,flag := a.(int);flag{
// 		fmt.Println("转换成功")
// 		fmt.Println(b)
// 	}else {
// 		fmt.Println("转换失败")
// 	}
// 	fmt.Println("下面的代码继续执行。。。。")
// }



// func (p Phone)Stop(){
// 	fmt.Println("手机停止工作。。。")
// }
// func(p Phone)call(){
// 	fmt.Printf("使用%v手机打电话。。。\n",p.name)
// }


// type Camera struct{
// 	name string
// }
// func(c Camera)Start(){
// 	fmt.Println("相机开始工作。。。")
// }
// func(c Camera)Stop(){
// 	fmt.Println("相机停止工作。。。")
// }




func checkType(items ...interface{}){
	for i ,arg := range items{
		var I int = i + 1
		switch v :=arg.(type){
		case int:
			fmt.Printf("第%v个参数是int类型的数据，值为：%d\n",I,v)
		case float64:
			fmt.Printf("第%v个参数是float类型的数据，值为：%f\n",I,v)
		case string:
			fmt.Printf("第%v个参数是string类型的数据，值为：%s\n",I,v)
		case bool:
			fmt.Printf("第%v个参数是bool类型的数据，值为：%t\n",I,v)
		default:
			fmt.Printf("第%v个参数是一个未知类型，值为：%v\n",I,v)
		}		
	}
}

func main(){
	checkType(23,34,11,"你好",true,struct{}{})
}

